package org.dei.perla.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;

public abstract class ConfigurableObject {
	public void loadValueFromFile(String xmlPropertyFile){
		Properties properties = new Properties();
		Field fields[] = this.getClass().getDeclaredFields();
		try {
			properties.loadFromXML(new FileInputStream(new File(xmlPropertyFile)));
			for(Field f : fields){
				
			}
		} catch (InvalidPropertiesFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	} 
	

	/**
	 * Invoca il metodo setter corrispondente al campo in esame
	 * @param object oggetto su cui invocare il metodo
	 * @param field campo da impostare tramite setter
	 * @param valueToSet valore a cui impostare il campo
	 * @throws IllegalArgumentException
	 */
	private static <T> void invokeSetter(Object object, Field field, Object valueToSet, Class<T> valueToSetClass) throws IllegalArgumentException {

		try {	
			String methodName = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
			Class<?>[] parameterClasses = new Class<?>[1];
			parameterClasses[0] = valueToSetClass;
			Method tmpMethod = object.getClass().getMethod(methodName, parameterClasses);

			Object[] tmpArray = new Object[1];
			tmpArray[0] = valueToSet;
			tmpMethod.invoke(object, tmpArray);

		} catch (SecurityException e) {
			throw new IllegalArgumentException("L'oggetto di tipo " + object.getClass().getName()
					+ " passato come parametro non permette l'accesso al campo"
					+ field.getName() + ". Controllare che sia stato dichiarato come pubblico!");

		} catch (NoSuchMethodException e) {
			throw new IllegalArgumentException("L'oggetto di tipo " + object.getClass().getName()
					+ " passato come parametro non ha metodo setter per il campo "+ field.getName() + "!");

		} catch (IllegalAccessException e) {
			throw new IllegalArgumentException("L'oggetto di tipo " + object.getClass().getName() 
					+ " passato come parametro non ha setter pubblico per il campo" + field.getName() + "!");

		} catch (InvocationTargetException e) {
			throw new IllegalArgumentException("Il metodo setter per il campo"
					+ field.getName() + " del tipo " + object.getClass().getName() + 
			"ha generato un'eccezione! Controllare la sua implementazione");
		}
	}
}
